<?php
/**
 * Возвращает безопасную для сохранения в БД строку (в том числе преобразовывает и теги)
 *
 * @param string $toBeEscaped - строка, которую следует сделать безопасной
 * @return string - безопасная строка
 */
function absolutelyEscapeString(string $toBeEscaped){
  if (!get_magic_quotes_gpc() && !get_magic_quotes_runtime())
    return mysql_escape_string(htmlspecialchars($toBeEscaped));
  else
    return htmlspecialchars($toBeEscaped);
}

/**
 * Возвращает безопасную для сохранения в БД строку (без преобразования тегов)
 *
 * @param string $toBeEscaped - строка, которую следует сделать безопасной
 * @return string - безопасная строка
 */
function absolutelyEscapeStringSavingHtml(string $toBeEscaped){
  if (!get_magic_quotes_gpc() && !get_magic_quotes_runtime())
    return mysql_escape_string($toBeEscaped);
  else
    return addslashes($toBeEscaped);
}

/**
 * Возвращает безопасную для сохранения в БД строку (с учетом обработки WYSYWYG редактором)
 *
 * @param string $toBeEscaped - строка, которую следует сделать безопасной
 * @return string - безопасная строка
 */
function absolutelyEscapeStringFromWysiwyg(string $toBeEscaped){
    return absolutelyEscapeStringSavingHtml( Service_Editor::parseHTML($toBeEscaped) );
}

/**
 * Возвращает безопасную для сохранения в БД строку (без преобразования тегов)
 *
 * @param string $toBeEscaped - строка, которую следует сделать безопасной
 * @return string - безопасная строка
 */
function unescapeString(string $toBeUnescaped){
  if (!get_magic_quotes_gpc() && !get_magic_quotes_runtime())
    return stripslashes($toBeEscaped);
  else
    return stripslashes($toBeUnescaped);
}


/**
 * Обрабочтчик непойманных исключений
 * Выводит информацию о необработанных исключениях
 *
 * @param Exception $exception - необработанное исключение
 */
function exceptionHandler(Exception $exception){
  echo '<div class="programmError">';
  echo '<strong>Не пойманное исключение</strong><br />';
    echo 'Сообщение: ' . $exception->getMessage() . '<br />';
    echo 'Файл: <strong>' . $exception->getFile() . '</strong>, строка <strong>' . $exception->getLine() . '</strong><br />';
    $arrExceptionTrace = $exception->getTrace();
    if(sizeof($arrExceptionTrace)){
      echo 'Цепочка:<br />';
      for ($i = 0; $i < sizeof($arrExceptionTrace); $i++) {
        echo '&nbsp;&nbsp;&nbsp;&nbsp;<strong>' . $arrExceptionTrace[$i]['file'] . '</strong>, строка <strong>' . $arrExceptionTrace[$i]['line'] . '</strong>, функция <strong>' . $arrExceptionTrace[$i]['function'] . '</strong>(';
        for ($j = 0; $j < sizeof($arrExceptionTrace[$i]['args']); $j++) {
        	if($j != 0)
        	  echo ', ';
        	echo $arrExceptionTrace[$i]['args'][$j];
        }
        echo ')<br />';  	
      }    
    }
  echo '</div><br />';  
}

/**
 * Обработчик ошибок, предупреждений и пр.
 * Выводит информацию о всевозможных ошибках
 *
 * @param integer $errType
 * @param string $errMsg
 * @param string $errFile
 * @param integer $errLine
 * @param array $errContext
 */
function errorHandler($errType, $errMsg, $errFile, $errLine, $errContext) {
  switch ($errType) {
    //E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING - эти ошибки нельзя обработать
    case E_WARNING: case E_NOTICE: case E_CORE_WARNING: case E_USER_ERROR: case E_USER_WARNING: case E_USER_NOTICE: //Выводим все важные предупреждения в браузер, в лог-файл
    echo '<div class="programmError">';
  	  echo '<strong>' . getExcteptionTypeName($errType) . '</strong><br />';
    echo 'Сообщение: ' . $errMsg . '<br />';
    echo 'Файл: <strong>' . $errFile . '</strong>, строка <strong>' . $errLine . '</strong><br />';
	  echo '</div><br />';
	  case (E_NOTICE | E_USER_NOTICE):
    default: //Выводим определенные и оставшиеся ошибки в лог-файл
    	$logMsg = date("Y-m-d H:i:s") . ' Ошибка ' . $errType . ' в файле ' . $errFile . ' (' . $errLine . '): ' . $errMsg . "\n";
	    $logErrType = 3;
      error_log($logMsg, $logErrType, LOG);	 
	}
}
/**
 * Выдает текстовое представление типа ошибки по его числовому эквиваленту
 *
 * @param integer $errType - числовой тип ошибки
 * @return string - строковый тип ошибки
 */
function getExcteptionTypeName($errType){
  switch ($errType){
    case 1: return 'FATAL ERROR';
    case 2: return 'WARNING';
    case 4: return 'PARSE';
    case 8: return 'NOTICE';
    case 16: return 'CORE_ERROR';
    case 32: return 'CORE_WARNING';
    case 64: return 'COMPILE_ERROR';
    case 128: return 'COMPILE_WARNING';
    case 256: return 'USER_ERROR';
    case 512: return 'USER_WARNING';
    case 1024: return 'USER_NOTICE';
    case 2048: return 'STRICT';
  }
}

/**
 * Из двух массивов формируем новый, содержащий элементы первого массива, которых нет во втором массиве
 *
 * @param array $arr1
 * @param array $arr2
 * @return array
 */
function arrayFullDifference($arr1, $arr2) {
  $arrNotExists = array();
  foreach ($arr1 as $element) 
    if (!in_array($element, $arr2))
      $arrNotExists[] = $element;
  return $arrNotExists;
}

/**
 * Из двух ассоциативных массивов формируем новый, содержащий элементы первого массива, которых нет во втором массиве
 *
 * @param array $arr1
 * @param array $arr2
 * @param string $strField1 - поле первого ассоциативного массива, по которому производится сравнение
 * @param string $strField2 - поле второго ассоциативного массива, по которому производится сравнение
 * @return array
 */
function getDataArraysFullDiff($arr1, $arr2, $strField1, $strField2) {
  $arrNotExists = array();
  foreach ($arr1 as $arr1Element) {
    $isArr1ElemInArr2 = false;
    foreach ($arr2 as $arr2Element) {
      if ($arr1Element[$strField1] == $arr2Element[$strField2]) {
        $isArr1ElemInArr2 = true;
        break;
      }
    } 
    if (!$isArr1ElemInArr2)
      $arrNotExists[] = $arr1Element;
  }
  return $arrNotExists;
}

/**
 * Возвращаем колонку из двумерного ассоциативного массива
 *
 * @param array $arrSrc
 * @param string $strField
 * @return array
 */
function getArrayColumn($arrSrc, $strField) {
  $arrColumn = array();
  foreach ($arrSrc as $arrElement)
    $arrColumn[] = $arrElement[$strField];
  return $arrColumn;
}

?>